import { Notification, MessageBox } from 'element-ui'
import store from '@/store/index'

// 引入socket
const io = require('socket.io-client')

/**
 * 基本语法：
 *1. 创建连接:  const socket = io( 地址 )
 *2. 发送消息:  socket.emit(消息type类型,  消息内容,  接收到消息的回调函数)
 *3. 监听消息:  socket.on(事件type类型 ,  接收到消息的回调函数)
 */

//  测试时使用
// const socket = io()
// 打包部署时使用
const socket = io('ws://47.99.116.48:8889')

socket.on('connect', function() {
  console.log('与服务器连接成功!')
})

// 自己进入房间，获取房间当前信息,保存到vuex
socket.on('room_info', ({ nicknames, holder, lines }) => {
  store.commit('insertNicknames', nicknames)
  store.commit('updateHolder', holder)
  store.commit('updateLines', lines)
})

// 别的玩家进入了房间,将其保存到vuex中
socket.on('user_enter', userInfo => {
  Notification.success(`玩家:${userInfo.nickname},进入房间`)
  store.commit('updateNickNames', userInfo)
})
socket.on('connect', function() {
  store.commit('updateConnected', true)
})

// 玩家离开了房间
socket.on('user_leave', nickname => {
  store.commit('delFromNicknames', nickname)

  if (nickname === store.state.holder) {
    store.commit('updateHolder', '')
    store.commit('updateLines', [])
    Notification.error('主持人离开了游戏!')
  } else {
    // 登录状态下，才提醒有人退出
    localStorage.getItem('nickname') && Notification.error(`玩家${nickname}退出了游戏`)
  }
})

// 游戏开始，即某玩家称为主持人
socket.on('game_started', holder => {
  store.commit('updateHolder', holder)
  Notification.success(`游戏开始: ${holder} 作为主持人`)
})

// 已有主持人
socket.on('already_started', holder => {
  store.commit('updateHolder', holder)
  Notification.error(`该房间已有: ${holder} 作为主持人`)
})

// 房间主持人结束游戏
socket.on('game_stoped', (flag) => {
  // true为有玩家查猜中答案，而且倒计时时间到了
  if (flag) {
    Notification.warning(`时间到了，游戏结束`)
  } else {
    Notification.warning(`房间主持人:${store.getters.getHolder}结束游戏!`)
  }
  store.commit('updateCountDown', false)
  store.commit('updateHolder', '')
  store.commit('updateLines', '')
})

// 玩家猜答案后的反馈信息
socket.on('game_answered', ({ success, nickname, answer }) => {
  // if (alreadyDone) {
  //   MessageBox.alert('当前答案已被别人猜中了，不能再猜了!')
  //   return
  // }
  // 猜对了
  if (success) {
    MessageBox.alert(`玩家 ${nickname} 猜中正确的答案，积分+1`, {
      title: '恭喜',
      type: 'success'
    })
      .then(resolve => {
        store.commit('addUserScore', nickname)
      })
    store.commit('updateCountDown', true)

    return
  }
  Notification.error(`玩家:${nickname}猜错了,他的答案:${answer}`)
})

// 主持人开始绘制一条新的线条
socket.on('starting_line', line => {
  store.commit('drawNewLine', line)
})
// 主持人正在持续绘制当前线条1
socket.on('updating_line', line => {
  store.commit('updateLine', line)
})
// 主持人清空了画布
socket.on('clearing_line', () => {
  store.commit('clearLine')
})

// 获取群聊更新的信息
socket.on('room_update', addRoomText => {
  console.log(addRoomText, '广播的事件新增')
  store.commit('addRootText', addRoomText)
})

// 获取群聊所有信息
socket.on('room_text_all', rootTextContainer => {
  store.commit('updateRootText', rootTextContainer)
})
// 断开连接
socket.on('disconnect', () => {
  store.commit('updateConnected', false)
})

export default socket
